package legumes.shared.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.googlecode.objectify.annotation.Serialized;

public class PaiementModes implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * Exemple : CB : à partir de 20 €
	 * 			 TITRE_RESTAURANTS : 2 maximum par commande
	 * 			 CHEQUE : A l'ordre de "EURL La grande saveur du fruit de proximité"
	 * 			 ...
	 */
	@Serialized private Map<PaiementModeEnum, String> paiementModeConditionMap;

	public PaiementModes() {
		paiementModeConditionMap = new HashMap<PaiementModeEnum, String>();
	}

	public PaiementModeEnum[] getPaiementModes() {
		return getPaiementModes(paiementModeConditionMap.keySet());
	}
	
	public static PaiementModeEnum[] getPaiementModes(Collection<? extends PaiementModeEnum> paiementModeEnum_) {
		List<PaiementModeEnum> paiementModeEnumList 
			= new ArrayList<PaiementModeEnum>(paiementModeEnum_);
		
		Collections.sort(paiementModeEnumList, new Comparator<PaiementModeEnum>() {
	
			@Override
			public int compare(PaiementModeEnum pme0_, PaiementModeEnum pme1_) {
				return new Integer(pme0_.getOrderDisplayIndex()).compareTo(pme1_.getOrderDisplayIndex());
			}
		});
	
		return paiementModeEnumList.toArray(new PaiementModeEnum[0]);
	}
	
	public String getPaiementModesToString(boolean addNewLineForEachCategory_) {
		StringBuffer sb = new StringBuffer();
		String sep = ", ";
		PaiementModeEnum pmePrec = null;
		for(PaiementModeEnum pme : getPaiementModes()){
			if (pmePrec != null && ( ! pmePrec.isTheSameCategoryOfPaiement(pme) && addNewLineForEachCategory_) ){
				sb.append("\n");
			}
			sb.append( pme.getDisplayName() + sep );
			pmePrec = pme;
		}
		return sb.length()>0 ? sb.substring(0, sb.length() - sep.length()) : "";
	}
	
	public String getPaiementModesToHTMLString(boolean addNewLineForEachCategory_) {
		StringBuffer sb = new StringBuffer();
		String sep = ", ";
		PaiementModeEnum pmePrec = null;
		for(PaiementModeEnum pme : getPaiementModes()){
			if (pmePrec != null && ( ! pmePrec.isTheSameCategoryOfPaiement(pme) && addNewLineForEachCategory_) ){
				sb.append("<BR/>");
			}
			sb.append("<span title=\"" + getPaiementModeCondition(pme) + "\">" + pme.getDisplayName() + "</span>" + sep );
			pmePrec = pme;
		}
		return sb.length()>0 ? sb.substring(0, sb.length() - sep.length()) : "";
	}
	
	public String getPaiementModeCondition(PaiementModeEnum paiementMode_) {
		return paiementModeConditionMap.get(paiementMode_);
	}

	public void addPaiementMode(PaiementModeEnum paiementMode_, String condition_) {
		paiementModeConditionMap.put(paiementMode_, condition_);
	}

	public boolean hasPaiementMode(PaiementModeEnum pme) {
		return paiementModeConditionMap.get(pme) != null;
	}

	public void removePaiementMode(PaiementModeEnum pme) {
		paiementModeConditionMap.remove(pme);
	}

	public void updatePaiementModeCondition(PaiementModeEnum pme_, String condition_) {
		paiementModeConditionMap.put(pme_, condition_);
	}
	
}
